import java.util.Iterator;
import java.text.*;

public class Kassa
{
    private double geldInKassa;
    private int verkochteArtikelen;
    private KassaRij kassarij;

    /**
     * Constructor
     */
    public Kassa(KassaRij kassarij)
    {
        this.kassarij = kassarij;
        geldInKassa = 0.0;
    }
    
    /**
     * Getter voor kassarij
     * @return kassarij
     */
    public KassaRij getKassaRij()
    {
        return kassarij;
    }
    
    /**
     * Deze methode het aantal producten en de totaalprijs op
     * De implementatie wordt later vervangen door een echte betaling door de persoon
     * @param de persoon die moet afrekenen
     */
    public void rekenAf(Persoon persoon) throws TeWeinigGeldException
    {
        if(persoon.getDienblad() == null) {
            System.out.println("U heeft nog geen dienblad gepakt.");
        }
        else {
            Iterator<Artikel> it = persoon.getDienblad().getArtikelIterator();
            double totaalPrijs = 0.0;
            int gekochteArtikelen = 0;
            
            // kortingskaart variabelen
            double kortingsBedrag = 0.0;
            double kortingsPercentage = 0.0;
            boolean heeftMaximum = false;
            
            if(persoon instanceof KortingskaartHouder) {
                KortingskaartHouder kaartHouder = (KortingskaartHouder) persoon;
                kortingsPercentage = kaartHouder.geefKortingsPercentage();
                heeftMaximum = kaartHouder.heeftMaximum();
                if(heeftMaximum) {
                    kortingsBedrag = kaartHouder.geefMaximum();
                }
            }
            
            while(it.hasNext()) {
                gekochteArtikelen++;
                double artikelPrijs = it.next().getPrijs();
                double korting = artikelPrijs * kortingsPercentage;
                
                if(heeftMaximum) {
                    if(korting <= kortingsBedrag) {
                        artikelPrijs -= korting;        // verander artikelprijs
                        kortingsBedrag -= korting;      // Stel overgebleven korting bij
                    }
                    else {
                        artikelPrijs -= kortingsBedrag; // haal de overgebleven korting van artikelprijs af
                        kortingsBedrag = 0.0;           // er is nu geen korting over
                    }
                }
                else {
                    artikelPrijs -= korting;
                }
                totaalPrijs += artikelPrijs;
            }
            
            // Betaal met de betaalwijze van de persoon
            try {
                persoon.getBetaalwijze().betaal(totaalPrijs);
                geldInKassa += totaalPrijs;
                verkochteArtikelen += gekochteArtikelen;
            }
            catch(TeWeinigGeldException e) {
                //System.out.println(persoon.getVoornaam() + " " + persoon.getAchternaam() + " heeft niet genoeg geld om te betalen");
                throw new TeWeinigGeldException(persoon.getVoornaam() + " " + persoon.getAchternaam() + " heeft niet genoeg geld om te betalen");
            }
        }
    }
    
    /**
     * Geeft het aantal artikelen verkocht op deze kassa weer sinds de laatste reset
     * @return Aantal verkochte artikelen
     */
    public int aantalArtikelen()
    {
        return verkochteArtikelen;
    }
    
    /**
     * Deze methode geeft de totaalprijs van alle verkochte artikelen sinds de laatste reset
     * @return Totaalprijs verkochte artikelen
     */
    public double hoeveelheidGeldInKassa()
    {
        return geldInKassa;
    }
    
    /**
     * Deze methode reset de waarde van totaal verkochte artikelen, en totaalprijs van verkochte artikelen
     */
    public void resetKassa()
    {
        geldInKassa = 0.0;
        verkochteArtikelen = 0;
    }
}